﻿<?php

header("content-type: text/html; charset=utf-8");

class StaticBaseClass {
	public static $StaticProperty = "父类静态属性<br/>";
	const MAX = "父类常量<br/>";

	public static function staticMethod() {
		/* 在内部可以使用类名或self关键字，但是self访问的其定义时的类型，而不是运行时的类型,
		 * 这在子类和父类里有同名的静态成员和常量时会出现问题，为了避免这个问题可以使用static
		 * 关键字。
		 */

		echo get_called_class()." self::\$StaticProperty ".self::$StaticProperty;
		echo get_called_class()." StaticBaseClass::\$StaticProperty ".StaticBaseClass::$StaticProperty;
		echo get_called_class()." static::\$StaticProperty ".static::$StaticProperty;

		echo get_called_class()." self::MAX ".self::MAX;
		echo get_called_class()." StaticBaseClass::MAX ".StaticBaseClass::MAX;
		echo get_called_class()." static::MAX ".static::MAX;
	}
}

class StaticChildClass extends StaticBaseClass {
	public static $StaticProperty = "子类静态属性<br/>";
	const MAX = "子类常量<br/>";
}

// 在外部必须使用类名访问。
StaticBaseClass::StaticMethod();
echo StaticBaseClass::$StaticProperty;
echo StaticBaseClass::MAX;

// 在子类中可以调用父类的静态成员和常量。
StaticChildClass::StaticMethod();
echo StaticChildClass::$StaticProperty;
echo StaticChildClass::MAX;

?>